Standard Exceptions: std::exception, std::runtime_error, std::logic_error

Computer Programming - সি++ স্ট্যান্ডার্ড লাইব্রেরি (C++ Standard Library) Exception Handling (এরর এবং এক্সসেপশন হ্যান্ডলিং) |
115
115

C++ স্ট্যান্ডার্ড লাইব্রেরিতে বিভিন্ন ধরনের exceptions রয়েছে যা প্রোগ্রামিংয়ের সময় ত্রুটি (error) মোকাবেলা করতে ব্যবহৃত হয়। এই exceptions-গুলি std::exception এর মাধ্যমে প্রাপ্ত হয় এবং তাদের মধ্যে std::runtime_error, std::logic_error অন্যতম। প্রতিটি exception ক্লাস একটি নির্দিষ্ট ধরনের ত্রুটি নির্দেশ করে এবং সঠিকভাবে ব্যবহার করা হলে প্রোগ্রাম আরও নির্ভরযোগ্য এবং নিরাপদ হয়।

১. std::exception

std::exception হল C++ স্ট্যান্ডার্ড লাইব্রেরির সবচেয়ে সাধারণ exception ক্লাস, এবং এটি সব ধরনের exception এর মূল ক্লাস। এর মাধ্যমে আমরা ত্রুটি সম্পর্কিত বিস্তারিত তথ্য পেতে পারি। std::exception ক্লাসে what() নামক একটি মেথড রয়েছে, যা ত্রুটির বর্ণনা সরবরাহ করে।

উদাহরণ:

#include <iostream>
#include <exception>

int main() {
    try {
        throw std::exception();  // সাধারণ exception ফেলে দেওয়া
    } catch (const std::exception& e) {
        std::cout << "Caught exception: " << e.what() << std::endl;
    }
    return 0;
}

আউটপুট:

Caught exception: std::exception

এখানে, std::exception ত্রুটির বর্ণনা প্রদান করেছে। তবে এটি একটি সাধারণ ত্রুটি, তাই ত্রুটির আরও নির্দিষ্ট কারণ জানতে std::runtime_error বা std::logic_error ব্যবহার করা হয়।


২. std::runtime_error

std::runtime_error হল std::exception ক্লাস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত একটি বিশেষ ক্লাস যা রানটাইম (execution time) ত্রুটির জন্য ব্যবহৃত হয়। এই ত্রুটির মধ্যে এমন ধরনের ত্রুটি থাকে যা প্রোগ্রামের চলমান অবস্থায় ঘটতে পারে, যেমন অবৈধ ইনপুট, ফাইল খোলার সময় ত্রুটি, বা ভুল হিসাব

std::runtime_error-এর কনস্ট্রাক্টরে একটি বর্ণনা পাস করা যায় যা what() ফাংশনের মাধ্যমে ফেরত দেওয়া হয়।

উদাহরণ:

#include <iostream>
#include <stdexcept>

int main() {
    try {
        throw std::runtime_error("Something went wrong during runtime!");  // runtime_error ফেলা
    } catch (const std::runtime_error& e) {
        std::cout << "Caught runtime_error: " << e.what() << std::endl;
    }
    return 0;
}

আউটপুট:

Caught runtime_error: Something went wrong during runtime!

এখানে std::runtime_error ত্রুটির সাথে একটি কাস্টম মেসেজ প্রদান করা হয়েছে, যা what() মেথডের মাধ্যমে প্রদর্শিত হয়েছে।


৩. std::logic_error

std::logic_error একটি exception ক্লাস যা লজিক্যাল ত্রুটি নির্দেশ করে। এটি এমন ত্রুটি যা সাধারণত অকল্পনীয় বা অযৌক্তিক পরিস্থিতি সৃষ্টি হয়, যেমন ভুল ক্যালকুলেশন বা অকার্যকর স্টেটমেন্ট।

যখন এমন কোনো ত্রুটি ঘটে যা কোডের লজিকের কারণে বা ভুল ডেটা ব্যবহারের কারণে হয়ে থাকে, তখন std::logic_error ব্যবহার করা হয়। এর মধ্যে অনেক সাবক্লাসও রয়েছে, যেমন std::invalid_argument, std::out_of_range, std::domain_error ইত্যাদি।

উদাহরণ:

#include <iostream>
#include <stdexcept>

int main() {
    try {
        throw std::logic_error("Logic error encountered!");  // logic_error ফেলা
    } catch (const std::logic_error& e) {
        std::cout << "Caught logic_error: " << e.what() << std::endl;
    }
    return 0;
}

আউটপুট:

Caught logic_error: Logic error encountered!

এখানে, std::logic_error একটি ভুলের কারণে ফেলা হয়েছে, যা লজিক্যাল ত্রুটি হিসেবে চিহ্নিত করা হয়েছে।


৪. স্ট্যান্ডার্ড Exceptions এর অন্যান্য ক্লাস

C++ স্ট্যান্ডার্ড লাইব্রেরিতে std::exception এর অনেক অন্যান্য সাবক্লাস রয়েছে যা নির্দিষ্ট ধরনের ত্রুটি পরিচালনা করতে ব্যবহৃত হয়:

  • std::invalid_argument: অকার্যকর আর্গুমেন্ট (যেমন ফাংশনে ভুল ইনপুট দেওয়া)।
  • std::out_of_range: কোনো অ্যারে বা কনটেইনারের বাইরে যাওয়া।
  • std::overflow_error: অতিরিক্ত মান গণনা (overflow)।
  • std::underflow_error: কম মান গণনা (underflow)।
  • std::bad_alloc: মেমরি অ্যালোকেশন সমস্যা (যখন নতুন মেমরি অ্যাক্সেস করা সম্ভব হয় না)।
  • std::domain_error: একটি অকার্যকর ডোমেইন হিসেবে ইনপুট দেয়া (যেমন, নেগেটিভ নাম্বারের স্কয়ার রুট নেওয়া)।

উদাহরণ (অতিরিক্ত স্ট্যান্ডার্ড exceptions):

#include <iostream>
#include <stdexcept>

int main() {
    try {
        throw std::invalid_argument("Invalid argument provided!");  // invalid_argument ফেলা
    } catch (const std::invalid_argument& e) {
        std::cout << "Caught invalid_argument: " << e.what() << std::endl;
    }

    try {
        throw std::out_of_range("Index is out of range!");  // out_of_range ফেলা
    } catch (const std::out_of_range& e) {
        std::cout << "Caught out_of_range: " << e.what() << std::endl;
    }

    return 0;
}

আউটপুট:

Caught invalid_argument: Invalid argument provided!
Caught out_of_range: Index is out of range!

Exception Handling Flow

  1. Throwing Exceptions: যখন কোনো ত্রুটি ঘটবে, throw কিওয়ার্ডের মাধ্যমে একটি exception উত্থাপন করা হয়।
  2. Catching Exceptions: try ব্লকে রক্ষা করা কোডের মধ্যে exception হলে, সেই exception কে catch ব্লক দ্বারা ধরা হয় এবং সংশ্লিষ্ট সমাধান নেওয়া হয়।
  3. what() Method: what() মেথডটি exception সম্পর্কিত ত্রুটির বর্ণনা প্রদান করে।

উপসংহার

  • std::exception: সব ধরনের exceptions এর মূল ক্লাস। সাধারণভাবে ব্যবহৃত হয়, এবং এতে একটি what() মেথড রয়েছে যা ত্রুটির বর্ণনা দেয়।
  • std::runtime_error: রানটাইম ত্রুটি নির্দেশ করে এবং এটির কনস্ট্রাক্টরে একটি ত্রুটির বর্ণনা যুক্ত করা হয়।
  • std::logic_error: লজিক্যাল ত্রুটি নির্দেশ করে, যখন কোডের অযৌক্তিক আচরণ বা ভুল যুক্তি ঘটে।

স্ট্যান্ডার্ড exceptions গুলি C++-এ ত্রুটির সঠিক ব্যাখ্যা এবং সমাধান খুঁজে বের করার জন্য একটি শক্তিশালী হাতিয়ার।

Content added By
Promotion